# 节点属性插值程序的CMake配置文件

# 收集所有源文件
file(GLOB_RECURSE Q2_SOURCES 
    "src/*.cpp"
)

# 收集所有头文件
file(GLOB_RECURSE Q2_HEADERS 
    "include/*.h"
)

# 添加可执行文件
add_executable(q2trans ${Q2_SOURCES} ${Q2_HEADERS})

# 添加头文件路径
target_include_directories(q2trans PRIVATE 
    ${CMAKE_CURRENT_SOURCE_DIR}/include
)

# 链接线程库和OpenMP
find_package(Threads REQUIRED)
find_package(OpenMP REQUIRED)
target_link_libraries(q2trans PRIVATE 
    Threads::Threads
    OpenMP::OpenMP_CXX
)

# MSVC特定编译选项
if(MSVC)
    # 检查AVX2支持
    include(CheckCXXCompilerFlag)
    CHECK_CXX_COMPILER_FLAG("/arch:AVX2" COMPILER_SUPPORTS_AVX2)
    
    # 基本编译选项
    target_compile_options(q2trans PRIVATE 
        /W3          # 警告级别
        /utf-8       # UTF-8支持
        /Zc:inline   # 删除未使用的函数
        /Zc:__cplusplus # 启用正确的C++版本宏
        /permissive- # 严格的标准符合性
        $<$<BOOL:${COMPILER_SUPPORTS_AVX2}>:/arch:AVX2>  # 启用AVX2指令集
    )
    
    # Release配置特定��项
    target_compile_options(q2trans PRIVATE 
        $<$<CONFIG:Release>:
            /O2         # 完全优化
            /Ob3        # 更激进的内联
            /GL         # 全程序优化
            /Ot         # 优选速度
            /Oi         # 内部函数
            /Oy        # 省略帧指针
            /GF         # 字符串池
            /GT         # 优化纤程
            /GA         # 优化Windows应用
            /fp:fast    # 快速浮点
            /Qpar       # 自动并行
            /openmp     # OpenMP支持
            /MP         # 多处理器编译
        >
    )
    
    # Release配置的链接器选项
    target_link_options(q2trans PRIVATE
        $<$<CONFIG:Release>:
            /LTCG:INCREMENTAL  # 增量链接时间代码生成
            /OPT:REF          # 消除未引用的函数和数据
            /OPT:ICF          # 相同代码折叠
            /INCREMENTAL:NO   # 禁用增量链接
        >
    )

    # 添加预处理器定义
    target_compile_definitions(q2trans PRIVATE 
        _CRT_SECURE_NO_WARNINGS
        NOMINMAX  # 禁用Windows的min/max宏
        $<$<CONFIG:Release>:
            NDEBUG
            _HAS_EXCEPTIONS=0    # 禁用异常处理
        >
    )
endif()

# 优化设置
set_target_properties(q2trans PROPERTIES
    INTERPROCEDURAL_OPTIMIZATION TRUE  # 启用LTO
    CXX_VISIBILITY_PRESET hidden       # 隐藏符号
    VISIBILITY_INLINES_HIDDEN TRUE     # 隐藏内联符号
)

# 查找并链接必要的库
find_package(OpenMP REQUIRED)
target_link_libraries(q2trans PRIVATE OpenMP::OpenMP_CXX) 